package com.nowcoder.community.mapper;

import com.nowcoder.community.pojo.Message;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository("messageMapper")
public interface MessageMapper {

    /**
     * 查询当前用户的会话列表，针对每个会话只返回一条最新的私信
     * @param userId 用户id
     * @param offset 会话起始行号
     * @param limit  每个用户的会话在每页中显示会话的个数
     * @return 返回私信列表
     */
    List<Message> selectConversations(@Param("userId") int userId,
                                      @Param("offset") int offset,
                                      @Param("limit") int limit);

    /**
     * 查询当前用户的会话数量
     * @param userId 用户id
     * @return 返回会话数量
     */
    int selectConversationCount(int userId);

    /**
     * 查询某个会话所包含的私信列表
     * @param conversationId 会话id
     * @param offset 会话中私信起始行号
     * @param limit 每个会话中显示私信的个数
     * @return 返回消息列表
     */
    List<Message> selectLetters(@Param("conversationId") String conversationId,
                                @Param("offset") int offset,
                                @Param("limit") int limit);

    /**
     * 查询某个会话中包含的私信数量
     * @param conversationId 会话id
     * @return 返回私信数量
     */
    int selectLetterCount(String conversationId);

    /**
     * 查询会话中未读私信数量
     * @param userId 用户id
     * @param conversationId 会话id
     * @return 返回未读私信数量
     */
    int selectLetterUnreadCount(@Param("userId") int userId,@Param("conversationId") String conversationId);

    /**
     * 新增一条消息
     * @param message 消息实例
     * @return 新增消息的数量
     */
    int addMessage(Message message);

    /**
     * 修改消息状态（未读修改成已读）
     * @param ids 消息列表
     * @param status 消息状态
     * @return 修改消息的条数
     */
    int updateMessageStatus(@Param("ids") List<Integer> ids,@Param("status") int status);

    /**
     * 查询发给当前用户的某个主题最新的通知
     * @param userId 用户id
     * @param topic 主题
     * @return 通知
     */
    Message selectLatestNotice(@Param("userId") int userId, @Param("topic") String topic);

    /**
     * 查询发给当前用户的某个主题所包含的通知数量
     * @param userId 用户id
     * @param topic 主题
     * @return 通知数量
     */
    int selectNoticeCount(@Param("userId") int userId, @Param("topic") String topic);

    /**
     * 查询发给当前用户的某个主题未读通知的数量
     * @param userId 用户id
     * @param topic 主题
     * @return 通知数量
     */
    int selectNoticeUnreadCount(@Param("userId") int userId, @Param("topic") String topic);

    /**
     * 查询发给当前用户的某个主题所包含的通知列表
     * @param userId 通知的目标用户id
     * @param topic 通知的主题（评论、点赞、关注）
     * @param offset 每一页的起始行
     * @param limit  每次要查询记录的数量
     * @return 通知列表
     */
    List<Message> selectNotices(@Param("userId") int userId,
                                @Param("topic") String topic,
                                @Param("offset") int offset,
                                @Param("limit") int limit);
}

/*当方法的接收参数中含有多个普通类型（包括String）时，要加注解@Param("参数名")，
同时sql语句中的预编译符中的参数名要与注解中的参数名一致*/
